iT邦幫忙

2024 iThome 鐵人賽

DAY 16
0
Python

從Python入門到自製遊戲:30天鐵人挑戰之旅系列 第 16

Lambda 函式和高階函式

  • 分享至 

  • xImage
  •  

今天也來學點難的,有錯誤就是我還學得不夠融會貫通。/images/emoticon/emoticon06.gif

在 Python 中,匿名函式(lambda)是一種輕量級的函式表達方式,可以用來定義小型的一次性函式。這些函式通常只有單行,因此用 lambda 可以省去傳統函式定義 (def) 的冗長語法。Lambda 函式的結構是 lambda 參數: 表達式,其中參數可以是任意數量,然後接著一個單一表達式作為輸出。例如,lambda x: x * 2 就是一個簡單的函式,會將輸入值乘以 2 後返回結果。匿名函式主要用在簡化短小的運算邏輯,特別是在搭配高階函式時,效果更為顯著。

高階函式(higher-order functions)是指那些接受其他函式作為參數,或將函式作為回傳值的函式。常見的高階函式包括 map()、filter() 和 reduce(),這些函式能夠有效提升代碼的簡潔性與可讀性。這個範例展示了如何利用 lambda 與高階函式來對數字列表進行資料處理,使整個邏輯更加簡潔易讀。

from functools import reduce

# 定義一個整數列表
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 1. 使用 `map()` 對每個數字進行平方運算
squared_numbers = list(map(lambda x: x ** 2, numbers))
print(f"平方後的數字列表: {squared_numbers}")
# 輸出: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

# 2. 使用 `filter()` 過濾出平方值為偶數的數字
even_squared_numbers = list(filter(lambda x: x % 2 == 0, squared_numbers))
print(f"平方值為偶數的數字: {even_squared_numbers}")
# 輸出: [4, 16, 36, 64, 100]

# 3. 使用 `reduce()` 計算所有平方值為偶數的數字總和
sum_of_even_squares = reduce(lambda x, y: x + y, even_squared_numbers)
print(f"平方值為偶數的數字總和: {sum_of_even_squares}")
# 輸出: 220
  • map():使用 map() 將 numbers 列表中的每個數字進行平方運算(x 2),並將結果儲存到 squared_numbers 列表中。

  • filter():使用 filter() 過濾 squared_numbers 列表中為偶數的數字(x % 2 == 0),結果儲存在 even_squared_numbers 中。

  • reduce():使用 reduce() 累積所有偶數平方值,最終計算總和(x + y),並將結果儲存在 sum_of_even_squares 中。

使用這些函式時,匿名函式 (lambda) 可以快速定義簡單的操作邏輯,讓整體代碼變得更加簡潔流暢。與傳統的 for 迴圈相比,高階函式能夠更好地表達“對集合中的每個元素執行操作”的意圖,同時還能減少額外變數的使用。當然,若操作邏輯過於複雜,還是建議使用 def 函式來取代 lambda,以提高可讀性。學習 lambda 函式和高階函式是理解 Python 函式式編程(functional programming)的關鍵一步。靈活使用這些技巧,可以使代碼更加精簡、優雅,也能幫助程式設計師更好地處理資料處理和轉換的任務。

學習 lambda 和高階函式的過程,真的讓我對 Python 的簡潔有了全新的體會。過去在寫程式時,我常用 for 迴圈來處理列表資料,雖然也能完成任務,但有時候需要多寫幾行代碼,還要自己手動管理變數。可是接觸到 lambda 和高階函式之後,我發現原來可以用一行簡單的代碼就做到之前好幾行才能完成的事情!

那今天就先這樣。/images/emoticon/emoticon29.gif


上一篇
元類 (Metaclasses) 與類
下一篇
裝飾器與閉包
系列文
從Python入門到自製遊戲:30天鐵人挑戰之旅26
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言